'''
Created on Jul 31, 2012

Traduccion a python del programa creado por Jose Tomes Marquinez

@author: Nico
'''
import logging
'''
Falta generalizar para n salas de tipo n' con archivo de clusters p.
'''
cantSalas=(12,17,7)
cantTipoSalas=3
salas=(30,45,70)
class PatronGenerator(object):

    def __init__(self):
        #clustersFilePath = raw_input("Insertar nombre del archivo con clusters")
        #logging.basicConfig(filename='LOG.log',level=logging.DEBUG)        
        clustersFilePath = "p.txt"
        archivoClusters = self.leerPath(clustersFilePath)
        
        self.clusters = {}
        self.output = {}
        self.cantTipoSalas = cantTipoSalas
        self.salas = salas
        self.cantSalas = cantSalas
        self.patronesEnOutput = []
        self.todoPatrones = []
        
        for s in archivoClusters:
            clusterSplit = s.split(',')
            clust = clusterSplit[0]
            alumns = clusterSplit[1]
            self.clusters[clust]=alumns
            self.output[clust]=""
            #logging.info("cluster: " + str(clust) +" = "+str(self.clusters[clust]))
        for i in range(0,self.cantSalas[0]+1):
            for j in range(0,self.cantSalas[1]+1):
                for k in range(0,self.cantSalas[2]+1):
                    self.todoPatrones.append([i,j,k])
                    self.patronesEnOutput.append(False)  
        
    def leerPath(self, path):
        _file = open(path,"r")
        archivo = []
        archivo.append(_file.readline())
        while archivo[len(archivo)-1]!="":
            archivo.append(_file.readline())
        _file.close()
        archivo = archivo[0:len(archivo)-1]
        return archivo
    
    def prodPunto(self, vect1):
        result = 0        
        for i in range(0,self.cantTipoSalas) :
            result += vect1[i]*self.salas[i]
        return result
    
    def generarPatrones(self):
            '''
            Primero listar todos los patrones posibles.
            //Luego, ver cuales cumplen el requisito de alumnos.
            //Luego, optimizar segun Paretto.
            '''          
            for  clust in self.clusters:
                valueOutput = self.generarPatronActual(self.clusters[clust])
                self.output[clust] = valueOutput
                #logging.info("cluster generado: "+ str(clust)+" "+ str(self.output[clust]))
            self.generarOutputFile();
    
    def generarPatronActual(self, size):
        patronesAceptados = []
        for i in range(len(self.todoPatrones)):
            patronesAceptados.append(False)
        #print patronesAceptados
        #print self.todoPatrones
        for i in range(len(patronesAceptados)):
            if int(self.prodPunto(self.todoPatrones[i])) >= int(size):
                patronesAceptados[i] = True                
        for j in range(len(patronesAceptados)):
            if (patronesAceptados[j]):   # Ultimo
                for i in range(0,j):
                    if (patronesAceptados[i]): # Comparando con
                        if (int(self.todoPatrones[i][0]) <= int(self.todoPatrones[j][0]) and int(self.todoPatrones[i][1]) <= int(self.todoPatrones[j][1]) and int(self.todoPatrones[i][2]) <= int(self.todoPatrones[j][2])):
                            patronesAceptados[j] = False  
        patrones = []
        for i in range(len(patronesAceptados)):
            if (patronesAceptados[i]):
                patrones.append(i)
        return patrones
    
    def generarOutputFile(self):
        sr = open("patrones.inc","w")
        for v in self.output:
            for i in self.output[v]:
                self.patronesEnOutput[i] = True
        sr.write("/\n");
        for i in range(0,len(self.patronesEnOutput)):
            if (self.patronesEnOutput[i]):
                sr.write("p" + str(i+1) + "\n")
        sr.write("/\n")
        sr.close()
        sr1 = open("N.inc","w")
        for  kv in self.output:
            for i in self.output[kv]:
                sr1.write("N(\"" + str(kv) + "\",\"p" + str(i+1)+ "\") = 1;\n")
        sr1.close()
        sr3 = open("QN.inc","w")
        for  i in range(0,len(self.patronesEnOutput)):
            if (self.patronesEnOutput[i]):
                sr3.write("QN(\"p" + str(i + 1) + "\",\"pequena\")=" + str(self.todoPatrones[i][0]) + ";\n");
                sr3.write("QN(\"p" + str(i + 1) + "\",\"mediana\")=" + str(self.todoPatrones[i][1]) + ";\n");
                sr3.write("QN(\"p" + str(i + 1) + "\",\"grande\")=" + str(self.todoPatrones[i][2]) + ";\n");
        sr3.close();  
        
        #    StreamWriter sr2 = new StreamWriter("output.txt");
        #    foreach (KeyValuePair<int, List<int>> kv in this.output)
        #    {
        #        foreach (int i in kv.Value)
        #        {
        #            sr2.WriteLine(kv.Key + " {" + this.todoPatrones[i][0] + "," + this.todoPatrones[i][1] + "," + this.todoPatrones[i][2] + "}");
        #        }
        #    }
        #    sr2.Close();
        #    */
            
            
        
        
